package com.lin.manager.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.lin.manager.common.req.QueryPage;
import com.lin.manager.common.utils.TreeUtil;
import com.lin.manager.redis.constants.RedisConstants;
import com.lin.manager.redis.service.RedisService;
import com.lin.manager.system.dao.SysDeptDao;
import com.lin.manager.system.entity.SysDeptEntity;
import com.lin.manager.system.model.vo.DeptVo;
import com.lin.manager.system.service.SysDepartmentService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @作者: 林江
 * @创建时间: 2024/3/11
 * @功能:
 */
@Slf4j
@Service
public class SysDepartmentServiceImpl implements SysDepartmentService {
    @Autowired
    private SysDeptDao sysDeptDao;
    @Autowired
    RedisService redisService;

    @Override
    public List<DeptVo> cacheTree(QueryPage page) {
        // 从缓存中获取部门树形结构
        List list = redisService.executeLock(() -> this.list(page), SysDepartmentService.class.getName(), "cacheTree", List.class);
        return list;
    }

    @Override
    public List<DeptVo> list(QueryPage page) {
        log.info("从数据库中获取部门列表。。。。。。。。。。。。。。。。。。");
        LambdaQueryWrapper<SysDeptEntity> wrapper = new LambdaQueryWrapper<>();
        List<SysDeptEntity> list = sysDeptDao.selectList(wrapper);

        boolean flag = false;
        if (StringUtils.isNotBlank(page.getKey())) {
            flag = true;
            wrapper.like(SysDeptEntity::getDname, page.getKey());
        }

        TreeUtil tree = TreeUtil.builder().parentIdName("pid").build();
        if (!flag) {
            return tree.tree(list, 0, DeptVo.class);
        } else {
            Set<Long> ids = sysDeptDao.selectList(wrapper).stream().map(SysDeptEntity::getId).collect(Collectors.toSet());
            // 递归获取符合的元素
            for (SysDeptEntity sysDeptEntity : list) {
                if (ids.contains(sysDeptEntity.getId()) && sysDeptEntity.getId() != 0) {
                    recursion(list, sysDeptEntity.getPid(), ids);
                }
            }

            List<SysDeptEntity> data = list.stream().filter(item -> ids.contains(item.getId())).collect(Collectors.toList());
            return tree.tree(data, 0, DeptVo.class);
        }
    }

    @Override
    public void add(SysDeptEntity sysDept) {
        sysDeptDao.insert(sysDept);
    }

    @Override
    public void update(SysDeptEntity sysDept) {
        sysDeptDao.updateById(sysDept);
    }

    @Override
    public void del(String id) {
        sysDeptDao.deleteById(id);
        // 删除缓存
        redisService.removeHash(RedisConstants.REDISSON.concat(SysDepartmentService.class.getName()), "cacheTree");
    }

    private void recursion(List<SysDeptEntity> list, Integer pid, Set<Long> ids) {
        for (SysDeptEntity sysDeptEntity : list) {
            if (sysDeptEntity.getId().intValue() == pid.intValue()) {
                ids.add(sysDeptEntity.getId());
                recursion(list, sysDeptEntity.getPid(), ids);
            }
        }
    }
}
